% SAEA-RFS算法测试脚本
% 对f1和f15函数进行优化测试，并画出寻优曲线图

clear;
clc;
close all;

% 屏蔽RBF矩阵奇异值警告
warning('off', 'MATLAB:nearlySingularMatrix');
warning('off', 'MATLAB:singularMatrix');

% 获取当前脚本所在目录并添加到MATLAB路径
current_dir = fileparts(mfilename('fullpath'));
addpath(genpath(current_dir));
fprintf('已添加路径: %s\n', current_dir);

% 检查必要的函数是否存在
required_functions = {'de', 'mutation', 'crossover', 'rbf', 'rbf_eval', 'rfs', 'cec2013', 'saea_rfs'};
missing_functions = {};

for i = 1:length(required_functions)
    if ~exist(required_functions{i}, 'file')
        missing_functions{end+1} = required_functions{i};
    end
end

if ~isempty(missing_functions)
    fprintf('错误：以下函数文件缺失：\n');
    for i = 1:length(missing_functions)
        fprintf('  - %s.m\n', missing_functions{i});
    end
    fprintf('请确保所有必要的函数文件都在当前目录中。\n');
    return;
end

fprintf('所有必要的函数文件检查完成！\n');

% 算法参数设置
m = 10;           % 种群大小
ts_num = 200;     % 初始训练样本数量
K = 20;           % 子问题数量
sub_size = 100;   % 子问题最大维度
nIter = 5;        % 子问题优化最大迭代次数

% 测试函数列表
func_list = [1, 15];  % f1和f15
func_names = {'F1: Shifted Elliptic Function', 'F15: Shifted Schwefel Function'};

% 存储结果
results = cell(length(func_list), 1);
best_fitness = zeros(length(func_list), 1);
total_time = zeros(length(func_list), 1);

% 对每个函数进行测试
for i = 1:length(func_list)
    func_num = func_list(i);
    fprintf('\n========================================\n');
    fprintf('开始测试 %s\n', func_names{i});
    fprintf('========================================\n');
    
    % 设置最大函数评估次数
    if func_num > 12 && func_num < 15
        D = 905;
    else
        D = 1000;
    end
    maxfe = 11 * D;  % 最大函数评估次数
    
    % 运行SAEA-RFS算法
    tic;
    [bestever, array, ~] = saea_rfs(func_num, m, ts_num, K, sub_size, nIter, maxfe);
    elapsed_time = toc;
    
    % 保存结果
    results{i} = array;
    best_fitness(i) = bestever;
    total_time(i) = elapsed_time;
    
    fprintf('\n函数%d优化完成！\n', func_num);
    fprintf('最优适应度值: %e\n', bestever);
    fprintf('总运行时间: %.2f 秒\n', elapsed_time);
    fprintf('总函数评估次数: %d\n', maxfe);
end

% 绘制寻优曲线图
figure('Position', [100, 100, 1200, 500]);

% 子图1：f1函数的寻优曲线
subplot(1, 2, 1);
if ~isempty(results{1})
    semilogy(results{1}(:, 1), results{1}(:, 2), 'b-', 'LineWidth', 2);
    title(func_names{1}, 'FontSize', 14, 'FontWeight', 'bold');
    xlabel('函数评估次数', 'FontSize', 12);
    ylabel('最优适应度值 (log scale)', 'FontSize', 12);
    grid on;
    legend(['最优值: ', num2str(best_fitness(1), '%.2e')], 'Location', 'best');
end

% 子图2：f15函数的寻优曲线
subplot(1, 2, 2);
if ~isempty(results{2})
    semilogy(results{2}(:, 1), results{2}(:, 2), 'r-', 'LineWidth', 2);
    title(func_names{2}, 'FontSize', 14, 'FontWeight', 'bold');
    xlabel('函数评估次数', 'FontSize', 12);
    ylabel('最优适应度值 (log scale)', 'FontSize', 12);
    grid on;
    legend(['最优值: ', num2str(best_fitness(2), '%.2e')], 'Location', 'best');
end

% 调整子图间距
sgtitle('SAEA-RFS算法寻优曲线图', 'FontSize', 16, 'FontWeight', 'bold');

% 显示结果总结
fprintf('\n========================================\n');
fprintf('测试结果总结\n');
fprintf('========================================\n');
for i = 1:length(func_list)
    fprintf('函数%d (%s):\n', func_list(i), func_names{i});
    fprintf('  最优适应度值: %e\n', best_fitness(i));
    fprintf('  运行时间: %.2f 秒\n', total_time(i));
    fprintf('  收敛曲线点数: %d\n', size(results{i}, 1));
    fprintf('\n');
end

% 保存结果
save('saea_rfs_test_results.mat', 'results', 'best_fitness', 'total_time', 'func_list', 'func_names');

fprintf('测试完成！结果已保存到 saea_rfs_test_results.mat\n');

% 恢复警告设置
warning('on', 'MATLAB:nearlySingularMatrix');
warning('on', 'MATLAB:singularMatrix');
